/**
 * 基础3D模型工厂，只负责生产基本的模型，如坐标轴，网格，立方体等等。
 * 不负责复杂模型的生成
 * 负责生产各个零件,把生产和消费分开
 * 
 * 1,实现一个方块
 * 
 * 2,需要加载3d mc的地方都是加载之后不显示，因为此时还没有计算3d位置，等g3d.render之后就会根据
 * md._visible来决定是否显示
 * 
 * 3,注意使用mesh的时候其实是不需要aVB_p的第一个顶点为0的！！，主流的3dmax obj文件都没这么弄，
 * 	是我的设计的失误，导致了复杂性，以后MeshVisu的顶点数据里不再需要额外的必须将第一个顶点设置为(0,0,0)!
 * 	以前那样设计是为了追踪模型在屏幕的位置的，没那个必要应该是，因为Model.v3d_p就记录着模型在空间的位置!
 * 	
 * 4, ！！！！千万注意建立模型的时候第一个点要是模型的中心，因为world.SortOnCCZ排序的时候我需要这个ccz!!
 */

package kgame5.k3d.util3d {
import kgame5.k3d.core.math.NumberUV;
import kgame5.k3d.core.math.Vertex3D;
import kgame5.k3d.core.obj3d.info.geometry.Face3D;
import kgame5.k3d.core.obj3d.info.geometry.GeometryInfo;
import kgame5.k3d.core.obj3d.info.geometry.Line3D;
import kgame5.k3d.core.obj3d.info.material.MaterialInfo;
import kgame5.k3d.core.obj3d.node3d.Mesh3D;
import kgame5.k3d.core.obj3d.node3d.Node3D;
import kgame5.k3d.core.obj3d.node3d.Sprite3D;
import kgame5.kutil.*;

import flash.display.*;

public class Factory3D{
	public function Factory3D(){
	}
	
	public static function CreateSprite3D(sLinkID:String,bUseScale:Boolean=true,bUseRotation:Boolean=true):Sprite3D{
		
		var mc:MovieClip=Util.AttachMC(sLinkID);
		var md:Sprite3D=new Sprite3D(mc,bUseScale,bUseRotation);
		
		return md;
	}
	
	//创建一个正方体,注册点在正中心
	public static function CreateCube(color:int=0x00ff00,A:Number=64,B:Number=64 ,H:Number=64):Mesh3D{
		
		//---------生成data3D
		var mesh:Mesh3D=new Mesh3D();
		
		var gi:GeometryInfo=new GeometryInfo();
		
		var mi:MaterialInfo=new MaterialInfo();
		mi.bmd=new BitmapData(2,2,false,color);
		mi.cullType=MaterialInfo.CULLTYPE_BACK;
		
		//A,B,H
		var A2:Number=A/2;
		var B2:Number=B/2;
		var H2:Number=H/2;
		
		gi.aVertex.push(new Vertex3D(-A2,-H2,B2));
		gi.aVertex.push(new Vertex3D(A2,-H2,B2));
		gi.aVertex.push(new Vertex3D(A2,-H2,-B2));
		gi.aVertex.push(new Vertex3D(-A2,-H2,-B2));
		gi.aVertex.push(new Vertex3D(-A2,H2,B2));
		gi.aVertex.push(new Vertex3D(A2,H2,B2));
		gi.aVertex.push(new Vertex3D(A2,H2,-B2));
		gi.aVertex.push(new Vertex3D(-A2,H2,-B2));
		
		gi.aNumberUV.push(new NumberUV(0,0));
		gi.aNumberUV.push(new NumberUV(1,0));
		gi.aNumberUV.push(new NumberUV(1,1));
		gi.aNumberUV.push(new NumberUV(0,1));
		
		gi.aFace.push(new Face3D(gi,1,0,2,0,1,2));
		gi.aFace.push(new Face3D(gi,2,0,3,0,3,2));
		gi.aFace.push(new Face3D(gi,4,5,6,0,1,2));
		gi.aFace.push(new Face3D(gi,4,6,7,0,1,2));
		gi.aFace.push(new Face3D(gi,6,2,7,0,1,2));
		gi.aFace.push(new Face3D(gi,7,2,3,0,1,2));
			
		gi.aFace.push(new Face3D(gi,5,4,1,0,1,2));
		gi.aFace.push(new Face3D(gi,1,4,0,0,1,2));
		gi.aFace.push(new Face3D(gi,5,1,6,0,1,2));
		gi.aFace.push(new Face3D(gi,6,1,2,0,1,2));
		gi.aFace.push(new Face3D(gi,7,0,4,0,1,2));
		gi.aFace.push(new Face3D(gi,3,0,7,0,1,2));
	
		//
		mesh.setGeometryInfo(gi);
		mesh.setMaterialInfo(mi);
		
		return mesh;
	}
	
//	//创建一个正方体,注册点在正中心
//	public static function CreateModel_TriChip(W:Number,defaultColor:int=0xff0000):Mesh3D{
//		 
//		var W2:Number=W/2;
//		
//		var aVB_p:Vector.<Number>;
//		aVB_p=new Vector.<Number>();
//		//aVB[0]=0;aVB[1]=0;aVB[2]=0;
//		var k:int=-1;
//		//下面
//		//
//		k++;
//		aVB_p[k*3+0]=-W2;
//		aVB_p[k*3+1]=-W2;
//		aVB_p[k*3+2]=W2;
//		//
//		k++;
//		aVB_p[k*3+0]=W2;
//		aVB_p[k*3+1]=-W2;
//		aVB_p[k*3+2]=W2;
//		
//		//
//		k++;
//		aVB_p[k*3+0]=-W2;
//		aVB_p[k*3+1]=-W2;
//		aVB_p[k*3+2]=-W2;
//		//上面
//		//
//		k++;
//		aVB_p[k*3+0]=-W2;
//		aVB_p[k*3+1]=W2;
//		aVB_p[k*3+2]=W2;
//		
//		
//		//
//		var a2IB:Array=[
//			[3,2,1],
//			[3,0,2],
//			[3,1,0],
//			
//			[1,2,0]
//			
//		];
//		//每个三角带的颜色
//		var aStripColor:Array=[
//			MathDG.ScaleColor(defaultColor,1/4),
//			MathDG.ScaleColor(defaultColor,2/4),
//			MathDG.ScaleColor(defaultColor,3/4),
//			MathDG.ScaleColor(defaultColor,4/4)
//		];
//		
//		//--
//		var visu:Visu=new MeshVisu(aVB_p,a2IB,-1,aStripColor,null,null,true);
//		
//		var md:Mesh3D=new Mesh3D(visu);//ABH的设置是在内部得出的
//		
//		return md;
//	}
//	
//	
	//创建一个坐标轴
	public static function CreateAxis():Node3D{
		var L:int=40;//总长
	
		
		var gi:GeometryInfo=new GeometryInfo();
		gi.aVertex.push(new Vertex3D(0,0,0));
		gi.aVertex.push(new Vertex3D(L,0,0));
		gi.aVertex.push(new Vertex3D(0,L,0));
		gi.aVertex.push(new Vertex3D(0,0,L));
		
		gi.aVertex.push(new Vertex3D(L-5,0,5));
		gi.aVertex.push(new Vertex3D(L-5,0,-5));
		
		gi.aVertex.push(new Vertex3D(5,0,L-20));
		gi.aVertex.push(new Vertex3D(-5,0,L-20));
		
		gi.aLine=new Vector.<Line3D>();
		gi.aLine.push(new Line3D(gi,0,1,0xffff00));
		gi.aLine.push(new Line3D(gi,0,2,0xff0000));
		gi.aLine.push(new Line3D(gi,0,3,0xffffff));
		
		gi.aLine.push(new Line3D(gi,4,5,0xffff00));//x轴上的小标志
		gi.aLine.push(new Line3D(gi,6,7,0xffffff));//z轴上的小标志
		
		
		
		var mesh:Mesh3D=new Mesh3D();
		mesh.setGeometryInfo(gi);
		
		
		return mesh;
	}
//	
//	
//	
//	//CC和RC最好不要做太大,RC,CC是边的数量,W是CELLSIZE
//	//左上角在原点，在x+和z-的一个面片model
//	public static  function CreateModel_TextureMesh_XOZ(CELLCC:int,CELLRC:int,W:Number,bmd:BitmapData,a2HeightMap:Array=null,bSortFace:Boolean=false):Model3D{
//		var CC:int=CELLCC+1;
//		var RC:int=CELLRC+1;
//		//Step1:设置顶点缓冲
//		var aVB_p:Vector.<Number>;
//		aVB_p=new Vector.<Number>();
//		
//		var r:int=0;
//		var c:int=0;
//		
//		for( r=0;r<RC;r++){
//			var z:Number=-r*W;
//			for(c=0;c<CC;c++){
//				var x:Number=c*W;
//				
//				var y:Number=0;
//				if(a2HeightMap!=null){
//				 y=a2HeightMap[r][c];
//				}
//				
//				aVB_p.push(x);
//				aVB_p.push(y);
//				aVB_p.push(z);
//			}
//		}
//		
//		//Step2:设置顶点纹理坐标缓冲
//		var unitU:Number=1/(CC-1);
//		var unitV:Number=1/(RC-1);
//		
//		var aVB_t:Vector.<Number>;
//		aVB_t=new Vector.<Number>();
//		
//		for(r=0;r<RC;r++){
//			var v:Number=r*unitV;
//			for(c=0;c<CC;c++){
//				var u:Number=c*unitU;
//				
//				aVB_t.push(u);
//				aVB_t.push(v);
//			}
//		}
//		
//		//Step3:构造三角条带
//		var a2IB:Array=new Array();
//		for(r=0;r<RC-1;r++){
//			var aIB:Array=new Array();
//			var startIdx:int=r*CC;
//			
//			for(c=0;c<CC;c++){
//				aIB.push(startIdx+c);
//				aIB.push(startIdx+c+CC);
//			}
//			a2IB.push(aIB);
//			
//		}
//		
//		//颜色
//		/*
//		var aStripColor:Array=[
//			0xff0000,
//			0xffff00,
//			0x00ff00
//		];
//		
//		//*/
//		
//		//Step4:设置纹理
//		var texture:Texture=new Texture(bmd.width,bmd.height,RC,CC,aVB_t,0,aVB_t.length);
//		//Step 4:构造文理条
//		var aStripTexture:Array=new Array();
//		//var sStripColor:Array=new Array();
//		for(var i:int=0;i<RC-1;i++){
//			aStripTexture.push(texture);
//			//sStripColor.push(i*255);
//		}
//
//		//--
//		var visu:Visu=new MeshVisu(aVB_p,a2IB,0xff00ff,null,bmd,aStripTexture,bSortFace);
//		
//		var md:Model3D=new Mesh3D(visu,false);
//		
//		return md;
//	}
	//CC和RC最好不要做太大,RCCELL,CCCELL是块的数量
	//左上角在(0,0),在(x+,z-)的位置
	public static  function CreateGridMesh(CC:int,RC:int,W:int,color:int=0x00ff00):Node3D{
		var c:int;
		var r:int;
		
		var gi:GeometryInfo=new GeometryInfo();
		gi.aLine=new Vector.<Line3D>();
		
		//Step1:设置顶点缓冲
		gi.aVertex.push(new Vertex3D(0,0,0));
		var startIdx:Number=1;
		for(c=0;c<CC+1;c++){
			var z1:Number=0;
			var z2:Number=-(RC)*W;
			
			gi.aVertex.push(new Vertex3D(W*c,0,z1));
			gi.aVertex.push(new Vertex3D(W*c,0,z2));
			
			gi.aLine.push(new Line3D(gi,startIdx++,startIdx++,color));
		}
		
		for(r=0;r<RC+1;r++){
			var x1:Number=0;
			var x2:Number=(CC)*W;
			
			gi.aVertex.push(new Vertex3D(x1,0,-r*W));
			gi.aVertex.push(new Vertex3D(x2,0,-r*W));
			
			gi.aLine.push(new Line3D(gi,startIdx++,startIdx++,color));
		}
		
		var mesh:Mesh3D=new Mesh3D();
		mesh.setGeometryInfo(gi);
		
		return mesh;
	}
//	//创建一个长方体,注册点再底面中心
//	public static function CreateCube2(A:Number,B:Number,H:Number,aStripColor:Array=null):Mesh3D{
//		 
//		var A2:Number=A/2;
//		var B2:Number=B/2;
//		
//		
//		var aVB_p:Vector.<Number>;
//		aVB_p=new Vector.<Number>();
//		
//		//中心
//		aVB_p[0]=0;aVB_p[1]=0;aVB_p[2]=0;
//		var k:int=0;
//		//下面
//		//
//		k++;
//		aVB_p[k*3+0]=-A2;
//		aVB_p[k*3+1]=0;
//		aVB_p[k*3+2]=B2;
//		//
//		k++;
//		aVB_p[k*3+0]=A2;
//		aVB_p[k*3+1]=0;
//		aVB_p[k*3+2]=B2;
//		//
//		k++;
//		aVB_p[k*3+0]=A2;
//		aVB_p[k*3+1]=0;
//		aVB_p[k*3+2]=-B2;
//		//
//		k++;
//		aVB_p[k*3+0]=-A2;
//		aVB_p[k*3+1]=0;
//		aVB_p[k*3+2]=-B2;
//		//上面
//		//
//		k++;
//		aVB_p[k*3+0]=-A2;
//		aVB_p[k*3+1]=H;
//		aVB_p[k*3+2]=B2;
//		//
//		k++;
//		aVB_p[k*3+0]=A2;
//		aVB_p[k*3+1]=H;
//		aVB_p[k*3+2]=B2;
//		//
//		k++;
//		aVB_p[k*3+0]=A2;
//		aVB_p[k*3+1]=H;
//		aVB_p[k*3+2]=-B2;
//		//
//		k++;
//		aVB_p[k*3+0]=-A2;
//		aVB_p[k*3+1]=H;
//		aVB_p[k*3+2]=-B2;
//		
//		//
//		var a2IB:Array=[
//			[2,1,3,4],
//			[6,5,7,8],
//			[7,8,3,4],
//			
//			[6,5,2,1],
//			[6,7,2,3],
//			[5,8,1,4]
//		];
//		
//		//卡通渲染技术，每个面的边框的拓扑结构，这样是为了能够被排序
//		var a2IB_line:Array=[
//			[1,2,3,4,1],
//			[5,6,7,8,5],
//			[3,4,8,7,3],
//			
//			[1,2,6,5,1],
//			[2,3,7,6,2],
//			[1,4,8,5,1]
//		];
//		
//		
//		
//		if(aStripColor==null){
//			//每个三角带的颜色
//			aStripColor=[
//				0x222222,
//				0x444444,
//				0x666666,
//				0x888888,
//				0xAAAAAA,
//				0xCCCCCC
//			];
//		}
//		//--
//		var visu:Visu=new MeshVisu(aVB_p,a2IB,-1,aStripColor,null,null,true);
//		
//		var md:Mesh3D=new Mesh3D(visu,true);
//		
//		return md;
//	}
//	
//	
//	
//	//创建一个长方形，原点在最LEFT_YCENTER,朝右方向的，_yrotation=0
//	//这个就是贴着地面的，不能有地形起伏
//	//注意这个不参见排序，因为这个就一个xyz做了一个很到的图形，三角面太大，不能精确排序
//	public static function CreateModel_Road(A:Number,B:Number,color:int=0xff9900):Mesh3D{
//		
//		var B2:Number=B/2;
//		
//		var aVB_p:Vector.<Number>;
//		aVB_p=new Vector.<Number>();
//		
//		aVB_p[0]=0;aVB_p[1]=0;aVB_p[2]=0;
//		var k:int=0;
//		//下面
//		//
//		k++;
//		aVB_p[k*3+0]=0;
//		aVB_p[k*3+1]=0;
//		aVB_p[k*3+2]=B2;
//		//
//		k++;
//		aVB_p[k*3+0]=A;
//		aVB_p[k*3+1]=0;
//		aVB_p[k*3+2]=B2;
//		//
//		k++;
//		aVB_p[k*3+0]=A;
//		aVB_p[k*3+1]=0;
//		aVB_p[k*3+2]=-B2;
//		//
//		k++;
//		aVB_p[k*3+0]=0;
//		aVB_p[k*3+1]=0;
//		aVB_p[k*3+2]=-B2;
//		
//		//
//		var a2IB:Array=[
//			[2,1,3,4]
//			
//		];
//		
//		/*
//		//卡通渲染技术，每个面的边框的拓扑结构，这样是为了能够被排序
//		var a2IB_line:Array=[
//			[1,2,3,4,1],
//			[5,6,7,8,5],
//			[3,4,8,7,3],
//			
//			[1,2,6,5,1],
//			[2,3,7,6,2],
//			[1,4,8,5,1]
//		];
//		//*/
//		
//		//每个三角带的颜色
//		var aStripColor:Array=[
//			color	
//		];
//		
//		//--
//		var visu:Visu;
//		
//		visu=new MeshVisu(aVB_p,a2IB,-1,aStripColor,null,null,true);
//		
//		var md:Mesh3D=new Mesh3D(visu,false);
//		
//		return md;
//	}
//	
//	//CC和RC最好不要做太大,RC,CC是边的数量,W是CELLSIZE
//	//原点在中心，在x+和z-的一个面片model
//	public static  function CreateShadow(W:Number,sLinkID:String):Model3D{
//		
//		var bmd:BitmapData=Util.AttachMCAsBmd(sLinkID,true);//true表示是使用透明背景
//		
//		
//		var CC:int=1+1;
//		var RC:int=1+1;
//		//Step1:设置顶点缓冲
//		var aVB_p:Vector.<Number>;
//		aVB_p=new Vector.<Number>();
//		
//		var r:int=0;
//		var c:int=0;
//		
//		for( r=0;r<RC;r++){
//			var z:Number=-r*W;
//			for(c=0;c<CC;c++){
//				var x:Number=c*W;
//				
//				var y:Number=0;
//				
//				
//				aVB_p.push(x-W/2);
//				aVB_p.push(y);
//				aVB_p.push(z+W/2);
//			}
//		}
//		
//		//Step2:设置顶点纹理坐标缓冲
//		var unitU:Number=1/(CC-1);
//		var unitV:Number=1/(RC-1);
//		
//		var aVB_t:Vector.<Number>;
//		aVB_t=new Vector.<Number>();
//		
//		for(r=0;r<RC;r++){
//			var v:Number=r*unitV;
//			for(c=0;c<CC;c++){
//				var u:Number=c*unitU;
//				
//				aVB_t.push(u);
//				aVB_t.push(v);
//			}
//		}
//		
//		//Step3:构造三角条带
//		var a2IB:Array=new Array();
//		for(r=0;r<RC-1;r++){
//			var aIB:Array=new Array();
//			var startIdx:int=r*CC;
//			
//			for(c=0;c<CC;c++){
//				aIB.push(startIdx+c);
//				aIB.push(startIdx+c+CC);
//			}
//			a2IB.push(aIB);
//			
//		}
//		
//		
//		
//		//Step4:设置纹理
//		var texture:Texture=new Texture(bmd.width,bmd.height,RC,CC,aVB_t,0,aVB_t.length);
//		//Step 4:构造文理条
//		var aStripTexture:Array=new Array();
//		//var sStripColor:Array=new Array();
//		for(var i:int=0;i<RC-1;i++){
//			aStripTexture.push(texture);
//			//sStripColor.push(i*255);
//		}
//
//		//--
//		var visu:Visu=new MeshVisu(aVB_p,a2IB,0xff00ff,null,bmd,aStripTexture,true);
//		
//		var md:Model3D=new Mesh3D(visu,true);
//		
//		return md;
//	}
//	
//	//xoz 上的一个平面
//		public static function CreatePlaneXOZ(W:Number,color:int):Model3D{
//		 
//		var W2:Number=W/2;
//		
//		var aVB:Vector.<Number>;
//		aVB=new Vector.<Number>();
//		
//		aVB[0]=0;aVB[1]=0;aVB[2]=0;
//		var k:int=0;
//		//下面
//		//
//		k++;
//		aVB[k*3+0]=-W2;
//		aVB[k*3+1]=0;
//		aVB[k*3+2]=W2;
//		//
//		k++;
//		aVB[k*3+0]=W2;
//		aVB[k*3+1]=0;
//		aVB[k*3+2]=W2;
//		//
//		k++;
//		aVB[k*3+0]=W2;
//		aVB[k*3+1]=0;
//		aVB[k*3+2]=-W2;
//		//
//		k++;
//		aVB[k*3+0]=-W2;
//		aVB[k*3+1]=0;
//		aVB[k*3+2]=-W2;
//		
//		//
//		var a2IB:Array=[
//			[2,1,3,4]
//		];
////		//每个三角带的颜色
//		var aStripColor:Array=[
//			color
//		];
//		
//		var aVB_t:Vector.<Number>;
//		aVB_t=new Vector.<Number>();
//		
//		aVB_t.push(
//			0,0,
//			1,0,
//			1,1,
//			0,1
//		);
//		
//		//--
//		
//		
//		//var shp:Shape=new Shape();
//		//GP.drawArc(shp.graphics, -1, 0x99ff0000, W/2, W/2, 0, 360, W/2, W/2);
//		//bmd.draw(shp);
//		//*/
//		
////		//Step4:设置纹理
////		var texture:Texture=new Texture(0,W,W,1,1,aVB_t,0,4);
////		
////		var aStripTexture:Array=[
////			texture
////		];
//		
//		//--
//		var visu:Visu=new MeshVisu(aVB,a2IB,-1,aStripColor,null,null,true);
//		
//		
//		var md:Mesh3D=new Mesh3D(visu,true);
//		
//		
//		
//		return md;
//	}
	//一个平面，逆时针
	public static function CreateShadow(W:Number,sLinkID:String):Mesh3D{
		
		//---------生成data3D
		var mesh:Mesh3D=new Mesh3D();
		
		var gi:GeometryInfo=new GeometryInfo();
		
		var mi:MaterialInfo=new MaterialInfo();
		mi.bmd=Util.AttachMCAsBmd(sLinkID,true);//true表示是使用透明背景
		
		var W2:Number=W/2;
		
		gi.aVertex.push(new Vertex3D(-W2,0,W2));
		gi.aVertex.push(new Vertex3D(W2,0,W2));
		gi.aVertex.push(new Vertex3D(W2,0,-W2));
		gi.aVertex.push(new Vertex3D(-W2,0,-W2));
		
		gi.aNumberUV.push(new NumberUV(0,0));
		gi.aNumberUV.push(new NumberUV(1,0));
		gi.aNumberUV.push(new NumberUV(1,1));
		gi.aNumberUV.push(new NumberUV(0,1));
		
		gi.aFace.push(new Face3D(gi,1,0,2,1,0,2));
		gi.aFace.push(new Face3D(gi,2,0,3,2,0,3));
		
		//-----生成mesh
		mesh.setGeometryInfo(gi);
		mesh.setMaterialInfo(mi);
		
		return mesh;
	}
}//end of class
}
